﻿#pragma once
namespace LK
{
	namespace Collection
	{
		/**@brief 表示一个集合接口*/
		struct ICollections;
		/**@brief 表示一个集合接口代理*/
		struct PCollections;
		/**@brief 表示一个指定元素类型的集合接口*/
		template<class T>struct ICollection;
		/**@brief 表示一个指定元素类型的集合接口代理*/
		template<class T>struct PCollection;

		/**@brief 表示一个集合接口*/
		struct ICollections :virtual LK::Object
		{
			IMETHODS(PCollections, ICollections);
			/**@brief 获取元素数量*/
			virtual void clear() = 0;
			/**@brief 获取元素数量*/
			virtual index_t size()const = 0;
		};

		/**@brief 表示一个集合接口代理*/
		struct PCollections :PObject
		{
			PMETHODS(PCollections, ICollections);
			/**@brief 获取元素数量*/
			void clear()const { Ptr()->clear(); }
			/**@brief 获取元素数量*/
			index_t size()const { return Ptr()->size(); }
			static void AddTypeInfo();
		};

		/**@brief 表示一个指定元素类型的集合接口*/
		template<class T>struct ICollection :ICollections
		{
		};
		/**@brief 表示一个指定元素类型的集合接口代理*/
		template<class T>struct PCollection :PCollections
		{
			PMETHODS(PCollection<T>, ICollection<T>);
		};
	}
}